<?php

namespace frontend\controllers;

use GK\JavascriptPacker;
use GK\ParseMaster;
use yii\web\Controller;

/**
 * Site controller
 */
class EncryptController extends Controller
{

    public $enableCsrfValidation = false;

    /**
     * Displays homepage.
     *
     * @return mixed
     */
    public function actionIndex()
    {
        return $this->render('index');
    }


    public function actionXor()
    {
        $key = 'zjyr';
        $decrypt = '';
        $jsOriStr = '';
        if ($_POST) {
            $jsOriStr = $_POST['ori'];
            $jsStr = $this->xor_encrypt($jsOriStr, $key);

            $decrypt = "var str = '{$jsStr}';";
            $decrypt .= "var key = '{$key}';";
            $decrypt .= "var ret = '';";
            $decrypt .= "var k, keylen = key.length;";
            $decrypt .= "  str = str.split(',');";
            $decrypt .= "  for(var i=0; i<str.length; i++) {";
            $decrypt .= "           k = i % keylen;";
            $decrypt .= "           ret += String.fromCharCode(str[i] ^ key.charCodeAt(k));";
            $decrypt .= "       }";
            $decrypt .= "eval(ret);";
        }
        return $this->render('uglifyjs', ['jsOriStr' => $jsOriStr, 'decrypt' => $decrypt, 'title' => 'JS异或加密']);
    }

    //简单加密
    private function xor_encrypt($code, $key)
    {

        $len = strlen($code);
        $keylen = strlen($key);

        $str = '';
        for ($i = 0; $i < $len; $i++) {
            $k = $i % $keylen;
            $str .= (ord($code{$i}) ^ ord($key{$k})) . ',';
        }
        return substr($str, 0, -1);
    }


    public function actionUglifyjs()
    {

        $decrypt = '';
        $jsOriStr = '';

        if ($_POST) {
            $jsOriStr = $_POST['ori'];

            $myPacker = new JavascriptPacker($jsOriStr);
            $decrypt = $myPacker->pack();
            $decrypt=$this->js_unescape($decrypt);
        }

        return $this->render('uglifyjs', ['jsOriStr' => $jsOriStr, 'decrypt' => $decrypt, 'title' => 'JS混淆']);
    }


    private function js_unescape($str)
    {
        $ret = '';
        $len = strlen($str);
        for ($i = 0; $i < $len; $i++) {
            if ($str[$i] == '%' && $str[$i + 1] == 'u') {
                $val = hexdec(substr($str, $i + 2, 4));
                if ($val < 0x7f) $ret .= chr($val);
                else if ($val < 0x800) $ret .= chr(0xc0 | ($val >> 6)) . chr(0x80 | ($val & 0x3f)); else $ret .= chr(0xe0 | ($val >> 12)) . chr(0x80 | (($val >> 6) & 0x3f)) . chr(0x80 | ($val & 0x3f));
                $i += 5;
            } else if ($str[$i] == '%') {
                $ret .= urldecode(substr($str, $i, 3));
                $i += 2;
            } else $ret .= $str[$i];
        }
        return $ret;
    }


    public function actionMorse(){
        return $this->render('morse');
    }

}
